"""继承"""""


# 定义：继承就是一种新建类的方式，新建的类叫做子类（派生类），被继承的类叫做父类（基类）
# 子类会继承父类所有方法和属性
# 使用继承可以大大减少代码的冗余
# 派生：实现子类的过程就做派生

class Anmail:  # 定义一个父类
    # 类里有：实例方法、实例属性、类方法、类属性、特殊方法、静态方法
    def __init__(self, name):  # magic method
        self.name = name  # 实例属性

    def speak(self):  # 实例方法
        return f'{self.name}发出了声音'

    @staticmethod
    def anmail():  # 静态方法
        return '这是一个动物类'


class Dog(Anmail):  # 创建子类
    pass


# print(Dog('大黄').speak())

'''多态'''


# 定义：一种事物有多个形态，比如Anmail类，它可以是Dog Cat (一个父类可以有N个子类)，每个子类也可以有不同的属性和方法，这就是多态
# 多态性：同一个操作作用于不同的子类，会产生不同的结果

class Shape:  # 创建父类 “形状”
    def __init__(self):
        pass

    def area(self):
        pass


class Circle(Shape):  # 创建子类 “圆”
    def __init__(self, r):
        super().__init__()  # 如果想对父类的__init__方法重写，需要使用super()
        self.r = r  # 创建一个实例属性 “半径”

    def area(self):
        return 3.14 * self.r ** 2


class Rectangle(Shape):
    def __init__(self, hight, weight):
        super().__init__()
        self.weight = weight
        self.hight = hight

    def area(self):
        return self.weight * self.hight

def calc_area(shape:Shape): # 定义一个函数，形参的类型是Shape类，用来计算面积
    return shape.area()


print(calc_area(Circle(5)))
print(calc_area(Rectangle(1, 2)))